﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.SqlClient;
using NHibernate;
using TaxiCaosRESTServices.Dominio;

namespace TaxiCaosRESTServices.Persistencia
{
    public class UnidadDAO
    {
        public Unidad CrearUnidad(Unidad unidadACrear)
        {
            Unidad unidadCreada = null;
            string sql = "INSERT INTO unidad VALUES (@idunidad, @idmarca, @tipo, @placa, @estado)";
            int maxIdUnidad = 0;
            using (SqlConnection con = new SqlConnection(ConexionUtil.ObtenerConexion()))
            {
                con.Open();
                using (SqlCommand com = new SqlCommand(sql, con))
                {
                    maxIdUnidad = ObtenerIdUnidadMax();

                    com.Parameters.Add(new SqlParameter("@idunidad", maxIdUnidad));
                    com.Parameters.Add(new SqlParameter("@idmarca", unidadACrear.IdMarca));
                    com.Parameters.Add(new SqlParameter("@tipo", unidadACrear.Tipo));
                    com.Parameters.Add(new SqlParameter("@placa", unidadACrear.Placa));
                    com.Parameters.Add(new SqlParameter("@estado", unidadACrear.Estado));
                    com.ExecuteNonQuery();

                }
            }
            unidadCreada = ObtenerUnidad(unidadACrear.IdUnidad);
            return unidadCreada;
        }

        public Unidad ObtenerUnidad(int IdUnidad)
        {
            Unidad unidadEncontrada = null;
            string sql = "SELECT * FROM unidad WHERE IdUnidad=@idunidad";
            using (SqlConnection con = new SqlConnection(ConexionUtil.ObtenerConexion()))
            {
                con.Open();
                using (SqlCommand com = new SqlCommand(sql, con))
                {

                    com.Parameters.Add(new SqlParameter("@idunidad", IdUnidad));
                    using (SqlDataReader resultado = com.ExecuteReader())
                    {
                        if (resultado.Read())
                        {
                            unidadEncontrada = new Unidad()
                            {
                                IdUnidad = (int)resultado["IdUnidad"],
                                IdMarca = (string)resultado["IdMarca"],
                                Tipo = (string)resultado["Tipo"],
                                Placa = (string)resultado["Placa"],
                                Estado = (string)resultado["Estado"]

                            };

                        }

                    }

                }
            }

            return unidadEncontrada;
        }

        public Unidad ModificarUnidad(Unidad unidadAModificar)
        {
            Unidad unidadModificada = null;
            string sql = "UPDATE unidad SET IdMarca=@idmarca, Tipo=@tipo, Placa=@placa, Estado=@estado WHERE IdUnidad=@idunidad";
            using (SqlConnection con = new SqlConnection(ConexionUtil.ObtenerConexion()))
            {
                con.Open();
                using (SqlCommand com = new SqlCommand(sql, con))
                {
                    com.Parameters.Add(new SqlParameter("@idmarca", unidadAModificar.IdMarca));
                    com.Parameters.Add(new SqlParameter("@tipo", unidadAModificar.Tipo));
                    com.Parameters.Add(new SqlParameter("@placa", unidadAModificar.Placa));
                    com.Parameters.Add(new SqlParameter("@estado", unidadAModificar.Estado));
                    com.Parameters.Add(new SqlParameter("@idunidad", unidadAModificar.IdUnidad));
                    com.ExecuteNonQuery();

                }
            }
            unidadModificada = ObtenerUnidad(unidadAModificar.IdUnidad);
            return unidadModificada;
        }

        public void EliminarUnidad(Unidad unidadAEliminar)
        {
            Unidad unidadEliminada = null;
            string sql = "DELETE FROM unidad WHERE IdUnidad=@idunidad";
            using (SqlConnection con = new SqlConnection(ConexionUtil.ObtenerConexion()))
            {
                con.Open();
                using (SqlCommand com = new SqlCommand(sql, con))
                {
                    com.Parameters.Add(new SqlParameter("@idunidad", unidadAEliminar.IdUnidad));
                    com.ExecuteNonQuery();

                }
            }

        }

        public List<Unidad> ListarTodos()
        {
            List<Unidad> ListarUnidades = null;
            Unidad unidadEncontrada = null;


            string sql = "SELECT * FROM unidad";
            using (SqlConnection con = new SqlConnection(ConexionUtil.ObtenerConexion()))
            {
                con.Open();
                using (SqlCommand com = new SqlCommand(sql, con))
                {
                    using (SqlDataReader resultado = com.ExecuteReader())
                    {
                        ListarUnidades = new List<Unidad>();

                        while (resultado.Read())
                        {

                            unidadEncontrada = new Unidad()
                            {
                                IdUnidad = (int)resultado["IdUnidad"],
                                IdMarca = (string)resultado["IdMarca"],
                                Tipo = (string)resultado["Tipo"],
                                Placa = (string)resultado["Placa"],
                                Estado = (string)resultado["Estado"]
                            };

                            ListarUnidades.Add(unidadEncontrada);
                        }

                    }
                }
            }

            return ListarUnidades;
        }

        public Unidad ObtenerPorPlaca(Unidad unidadvalida)
        {
            using (ISession sesion = NHibernateHelper.ObtenerSesion())
            {
                string sentenciaSQL = "select d1 from Unidad d1 where d1.Placa = :Placa and d1.IdUnidad <> :IdUnidad ";
                IQuery query = sesion.CreateQuery(sentenciaSQL);
                query.SetParameter("Placa", unidadvalida.Placa);
                query.SetParameter("IdUnidad", unidadvalida.IdUnidad);
                IList<Unidad> lista = query.List<Unidad>();
                if ((lista == null) || (lista.Count == 0))
                {
                    return null;
                }
                return lista[0];
            }
        }

        public int ObtenerIdUnidadMax()
        {
            using (ISession sesion = NHibernateHelper.ObtenerSesion())
            {
                string sentenciaSQL = "select d1 from Unidad d1 where d1.IdUnidad = (select MAX(d2.IdUnidad) from Unidad d2)";
                IQuery query = sesion.CreateQuery(sentenciaSQL);
                IList<Unidad> lista = query.List<Unidad>();
                if ((lista == null) || (lista.Count == 0))
                {
                    return 0;
                }
                return lista[0].IdUnidad + 1;
            }
        }
    }
}